package com.bean.prototype;

/**
 * 原型模式
 * 用一个已经创建的实例作为原型，通过复制该原型对象来创建一个和原型相同或相似的新对象。
 * 在这里，原型实例指定了要创建的对象的种类。用这种方式创建对象非常高效，根本无须知道对象创建的细节
 * @author 顾志杰
 * @date 2021/8/2-10:39
 */
public class Prototype {

    /**
     * 原型模式的优点：
     *  Java 自带的原型模式基于内存二进制流的复制，在性能上比直接 new 一个对象更加优良。
     *  可以使用深克隆方式保存对象的状态，使用原型模式将对象复制一份，并将其状态保存起来，
     *  简化了创建对象的过程，以便在需要的时候使用（例如恢复到历史某一状态），可辅助实现撤销操作。
     * 原型模式的缺点：
     *  需要为每一个类都配置一个 clone 方法
     *  clone 方法位于类的内部，当对已有类进行改造的时候，需要修改代码，违背了开闭原则。
     *  当实现深克隆时，需要编写较为复杂的代码，而且当对象之间存在多重嵌套引用时，为了实现深克隆，
     *  每一层对象对应的类都必须支持深克隆，实现起来会比较麻烦。因此，深克隆、浅克隆需要运用得当。
     */

    /**
     * 原型模式包含以下主要角色。
     * 1.抽象原型类：规定了具体原型对象必须实现的接口。
     * 2.具体原型类：实现抽象原型类的 clone() 方法，它是可被复制的对象。
     * 3.访问类：使用具体原型类中的 clone() 方法来复制新的对象。
     */

    public static void main(String[] args) throws CloneNotSupportedException {
        Realizetype obj1 = new Realizetype();
        Realizetype obj2 = (Realizetype) obj1.clone();
        System.out.println("obj1==obj2?" + (obj1 == obj2));
    }



}

//具体原型类  浅克隆
class Realizetype implements Cloneable {
    Realizetype() {
        System.out.println("具体原型创建成功！");
    }
    public Object clone() throws CloneNotSupportedException {
        System.out.println("具体原型复制成功！");
        return (Realizetype) super.clone();
    }
}
